//+------------------------------------------------------------------+
//|                                                  IComparable.mqh |
//|                             Copyright 2000-2025, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#include "IEqualityComparable.h"  // 引入相等性比较接口（IEqualityComparable<T>），提供基础“相等/不等”判断能力

//+------------------------------------------------------------------+
//| IComparable<T> 泛型接口：MQL5 排序与比较标准接口                  |
//| 核心定位：继承自相等性比较接口 IEqualityComparable<T>，扩展“大小关系比较”能力， |
//|           为任意数据类型（基础类型、自定义结构/类）定义标准化的排序逻辑，    |
//|           支持集合排序、对象优先级判断、区间筛选等场景               |
//| 泛型特性：通过模板参数 <T> 适配任意数据类型，无需为每种类型重复定义比较接口， |
//|           同时确保比较操作的类型安全性（仅允许同类型对象比较）           |
//| 核心价值：作为“排序契约”，隔离“比较逻辑”与“业务逻辑”，使集合排序（如数组、链表）、|
//|           对象优先级判断等功能脱离具体数据类型，开发者只需实现接口方法，即可让 |
//|           自定义类型支持排序（如按订单开仓时间排序、按信号强度排序）         |
//| 与父接口关系：继承 IEqualityComparable<T>（提供 Equals() 相等性判断），扩展 Compare() 方法实现“大于/小于/等于”的完整比较， |
//|               形成“相等性判断→大小关系判断”的递进能力，覆盖所有比较场景     |
//| 适用场景：所有需要对数据进行排序、优先级排序、区间筛选的 MQL5 程序（EA、指标、脚本），|
//|           尤其适合自定义类型（如订单、持仓、信号）的排序管理（如按盈利排序订单、按时间排序交易记录）|
//+------------------------------------------------------------------+
template<typename T>
interface IComparable : public IEqualityComparable<T>
  {
   //----------------------------------------------------------------
   // 核心比较接口：定义当前对象与目标对象的大小关系
   //----------------------------------------------------------------
   /**
    * @brief 比较当前对象与目标对象的大小关系（核心方法，需子类实现具体逻辑）
    * @param value [in] 目标比较对象（类型与泛型参数 T 一致，确保类型安全）
    * @return int - 比较结果（严格遵循以下返回值定义，确保排序逻辑统一）：
    *               1. 返回 < 0：当前对象 < 目标对象（当前对象优先级更低，排序时在前）；
    *               2. 返回 = 0：当前对象 == 目标对象（与 Equals() 方法结果一致）；
    *               3. 返回 > 0：当前对象 > 目标对象（当前对象优先级更高，排序时在后）；
    * @note 实现规范与注意事项：
    *       1. 一致性：Compare() 返回 0 时，必须与 IEqualityComparable<T>::Equals() 方法返回 true 保持一致；
    *       2. 传递性：若 A.Compare(B) < 0 且 B.Compare(C) < 0，则 A.Compare(C) 必须 < 0；
    *       3. 对称性：A.Compare(B) 的返回值必须是 B.Compare(A) 返回值的相反数（如 A>B 则 B<A）；
    *       4. 自定义类型实现：需明确比较维度（如订单按开仓时间比较、信号按强度值比较），避免模糊逻辑；
    *       5. 空值处理：若 T 为指针类型，需先判断 value 是否为 NULL，避免空指针访问异常。
    */
   int       Compare(T value);
  };
//+------------------------------------------------------------------+